package com.itheima.web.controller;

import com.itheima.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Map;

/**
 * model:数据模型,用于封装数据
 * view :页面视图,用于展示数据
 * Controller(控制器): 处理用于交互的调度器,
 * */

//声明bean 并加到ioc容器中
@Controller
//一级请求url路径(指定模块的)
@RequestMapping("/param")
public class ParamController {

    //给当前方法定义一个请求url路径(二级请求)
    @RequestMapping("/test1")
    public String test1(@RequestParam(value = "username", required = true, defaultValue = "abc") String name, int age) {
        System.out.println("username" + name);
        System.out.println(age == 11);
        return "success";
    }

    //二级请求
    @RequestMapping("/test2")
    public String test2(User user, String hobbies) {
        System.out.println(hobbies);
        return "success";
    }

    //日期格式的参数  自动类型转换
    @RequestMapping("/test3")
    public String test3(Date birthday) {
        System.out.println(birthday);
        return "success";
    }

    /**
     * 携带数据响应页面的方式
     * 1.原生servletAPI(不建议使用 程序要尽量解耦)
     * 2.modelandview 值存入request作用域(不建议使用)
     * 3.model 值存入request作用域
     * 4.map:值存入到request作用域中
     * <p>
     * controller跳转大指定的controller
     * redirect:指定请求URL
     * 重定向:(客户端跳转)
     * forward:指定请求URL
     * 请求转发:(服务器跳转)
     */

    //原生servletAPI方式
    @RequestMapping("/test4")
    public String test4(HttpServletRequest request, HttpSession session) {
        //存入到request会话域中
        request.setAttribute("username", "admin");
        //存入到session会话域中
        session.setAttribute("username", "123456");
        return "main";
    }

    //ModelAndView方式
    @RequestMapping("/test5")
    public ModelAndView test5(ModelAndView mv) {
        //ModelAndView mv = new ModelAndView(); ?
        mv.setViewName("main");
        mv.addObject("username", "tony");
        return mv;
    }


    //model值存入request会话域方式 model数据模型:用于封装数据
    @RequestMapping("/test6")
    public String test6(Model model) {
        System.out.println("test6");
       //model值存会话域中
        model.addAttribute("username", "jack");
        //返回 请求跳转到指定功能页面
        return "forward:/user/update";
    }

    //map值存入request会话域中的方式
    @RequestMapping("/test7")
    public String test7(Map map) {
        System.out.println("test7...");
        map.put("username", "William");
        return "main";
    }

}
